Tema 0: Introducción a R y RStudio (Posit)

Muestreo y Análisis de Datos - Universidad de Alicante

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

Teresa Molina

Conceptos básicos

Introducción

  • Debéis tener instalados los programas gratuitos R y RStudio

  • Nos familiarizaremos con los conceptos y comandos básicos de programación en R

  • R es un lenguaje interpretado: ejecuta las instrucciones directamente en la consola

  • RStudio es un entorno de desarrollo integrado (IDE) que combina varias herramientas para facilitar el uso de R: consola, editor para escribir comandos, ayuda, etc.

R Studio

Empezando con R

  • Escribimos comandos en la consola y se ejecutan pulsando Enter:

    • La tecla de tabulador ofrece opciones de autocompletado

    • Ejecutar algo que no es un comando de R devuelve un error

2 + 2
3 * (1 - 4)^2
sqrt(log(5/2))
pi
hola
  • O en el Editor de RStudio y se envían a la consola la o las líneas seleccionadas para ser evaluadas con el icono o con el atajo de teclado Ctrl+Enter

  • NOTA: en MacOS, usad la tecla Command en lugar de Ctrl

Archivos de guion (“scripts”)

  • Es preferible incluir varios comandos en un archivo de texto para ejecutarlos

  • Se puede replicar el proceso de cálculos paso a paso (no como Excel)

  • Creamos un nuevo archivo con el icono o en el menú File > New File > R script (atajo Ctrl + Mays + N)

  • Guardamos el archivo con o en File > Save (atajo Ctrl + S), eligiendo un directorio y nombre de extensión “.R” (por defecto) o “.r”

  • En un archivo de guion (guardado), RStudio marca las líneas con error y muestra el mensaje de error al pasar el puntero

Trabajar con ficheros de guion

  • Cada comando es “una” línea y se ejecutan secuencialmente

  • Un comando se puede extender visualmente más de una línea hasta completarse: p.e., hasta cerrar los paréntesis.

    • Escribimos log(, en otra línea 9 y ejecutamos: la consola cambia de > a +

    • No hace “nada” esperando que completemos el comando.

  • El carácter # marca el inicio de un comentario: lo que sigue se “ignora” (no se ejecuta) en R
# Pueden ir al principio de la línea 
2 + 2 # o después de una instrucción
  • Comentar es un buen hábito: ayuda a entender/recordar qué hacemos

  • Notad que RStudio tiene resaltado de sintaxis: distinto color para comentarios, números, funciones, etc.

Directorio de Trabajo. Proyectos.

  • Conviene organizar los archivos relacionados con un mismo tema en una estructura de (sub)directorios a partir de un directorio de trabajo principal

  • Esto puede hacerse manualmente, pero RStudio permite definir proyectos para gestionarlo fácilmente a través del menú File o desplegando el icono en la parte superior derecha

  • Desde el menú File > New Proyect o desde el icono, creamos un nuevo proyecto que estará asociado a un directorio de trabajo.

    • El nombre del proyecto será el nombre del directorio

    • También se crea un archivo con el mismo nombre y extensión “.Rproj”

  • Tenemos la opción de usar un Nuevo Directorio para el nuevo proyecto, seleccionando una ubicación y un nombre para el proyecto=directorio en esa ubicación

  • O bien elegimos un directorio ya existente para nuestro proyecto

Proyectos (cont.)

  • Cuando cerramos y volvemos a abrir RStudio, tendremos activo el último proyecto abierto: ej.,

  • Tanto desde el menú como desde el icono de gestión de proyectos, podemos

    • cerrar el proyecto actual, File > Close Projects,

    • abrir otros proyectos guardados: File > Open Project o File > Recent Projects

  • Para trabajar en R con un archivo del proyecto, accedemos usando la ruta relativa al directorio de trabajo:

    • si están en el raíz del directorio: codigo.R, misdatos.Rdata

    • si están en un subdirectorio, indicamos la ruta separando directorios por /: datos/ventas.Rdata, datos/ano2020/ingresos.Rdata

  • La pestaña en el cuadrante inferior-derecho ofrece una forma visual de abrir, crear, copiar, mover o eliminar archivos o directorios, etc.

  • Evitad caracteres “raros” (acentos, espacios, etc.) en directorios y ficheros

Funciones en R

  • Las expresiones que aceptan argumentos se denominan funciones.
exp(2)
ceiling(5.2)
  • Algunos argumentos son obligatorios, otros tienen valores por defecto que se pueden omitir

  • Los argumentos se pueden especificar por nombre o por orden.

log(2, base=2)
log(2, 10)
log(base = 10, x = 2)
  • ¿Cómo sabemos la manera de usar una función (ej. argumentos necesarios) o comando de R?

Ayuda en R y RStudio

  • RStudio tiene autocompletado y ayuda flotante para funciones y otros elementos de R

    • P.e., si empezamos a escribir la función log, se muestra la forma esperada de trabajar con esa función
  • RStudio también tiene una pestaña para buscar ayuda

  • Las búsquedas online o las IAs (como chatGPT o Bard) pueden ser útiles.

  • PERO debemos tener un conocimiento mínimo para aprovechar realmente una solución

    • hay muchas formas de hacer lo mismo en R: una respuesta correcta puede no ajustarse a lo que ya sabemos
  • NO uséis copiar-pegar sin entender el código: copiar-pensar-adaptar

El operador de asignación

  • El operador <- almacena un contenido en un objeto con un nombre,1 que incluye letras, números y algunos carácteres especiales (“.”, “_”)
x <- 2*3    # asignación, no muestra resultado
x           # ejecutamos mostrar la variable   # print(x)
(x <- 2)    # asignación e impresión a la vez
  • R es “case-sensitive”: x y X son dos objetos distintos

  • Los objetos asignados pueden usarse posteriormente, p.e., para generar otros a partir de ellos

y <- x + 5  # asignamos y a partir del VALOR de x
(x <- x*3)  # re-asignamos x a partir de ella misma
y           # NO cambia con el nuevo valor de x           

El Espacio de Trabajo en R

  • El espacio de trabajo es el conjunto de objetos activos en memoria, resultado de todos los comandos ejecutados previamente

  • En RStudio, la pestaña muestra los objetos y su valor

  • Para mostrar y eliminar objetos del espacio de trabajo:

ls()        # mostrar objetos
rm(y)       # eliminar el objeto "y"
rm(a,b,c)   # eliminar varios objetos (separados por comas)
  • Borramos todos los objetos con en el Environment o el comando
rm( list=ls() )
  • Guardamos el contenido del entorno de trabajo con (o al cerrar RStudio), pero es innecesario si tenemos la secuencia de comandos

Mensajes de “Error” y “Warning”

  • En programación, cometer errores es normal

  • En muchos errores, R se “quejará” mostrando mensajes en rojo

    • Aviso: R ofrece un resultado (y continuará al siguiente comando), PERO indica que puede haber algo “no deseado”

    • Error: para la ejecución, sin resultado, e “informa” de la razón

  • Algunos mensajes son claros, pero otros requieren más investigación

  • Peor que un mensaje de error: escribimos (copiamos) un código que funciona pero no hace lo que queremos…

  • El ordenador NO se equivoca: hace lo que le pedimos según unas reglas bien definidas por R, que debemos conocer

    • Sed cuidadosos, pensad y entended cada paso del código

Objetos en R

Tipos de Objetos en R

  • TODO en R es un objeto, cada uno con distintas propiedades y, por tanto, distintas formas de trabajar con él
  • Además de las funciones, los principales objetos con los que trabajaremos son:

    1. vectores
    2. factores
    3. listas
    4. conjuntos de datos (“data frames”)
  • Además, estos objetos pueden contener varios tipos de datos o variables:

    • entero
    • numérico (números reales)
    • lógico (valores verdadero/falso)
    • caracteres

Vectores

  • Un vector es una secuencia de datos elementales, creados con el operador “c()” (combinar)
xvect <- c(2.5,-4.1,6.4,8.2)           # vector numérico
wvect <- c(3,0,-1,2)                   # vector de enteros
yvect <- c("hola", 'adios')            # vector de caracteres 
zvect <- c(FALSE, TRUE, T, F)          # vector lógico
  • Podemos crear vectores a partir de otros vectores o usando comandos
yvect <- c(1,3,5,7,9)
z <- c(xvect, yvect)
x <- rep(1, times=4)
y <- seq(from = 10, to = 1, by = -1)
  • Para incrementos unitarios consecutivos se usa :
z <- 1:10       # equivale a z <- seq(1,10,1)

Clase de un vector

  • La clase de un objeto es única (solo un tipo de elementales) y puede conocerse en el Environment o con str()
str(yvect)
  • Si se mezclan tipos distintos, R busca una clase que “acomode” a todos
vcr <- c("lunes", 2) 
  • Forzamos que un objeto sea tratado con una clase concreta, con as.integer(), as.numeric(), as.character() y as.logical()

    • Si no se puede convertir a número, devuelve NA (con un “warning”)
  • NO se pueden realizar operaciones incompatibles entre clases

    • Cuidado con las comillas: NO es lo mismo un objeto (su contenido) que el carácter de su nombre
a <- 4
c <- 'a' + 1

Atributos de un objecto Vector

  • Los vectores pueden tener nombres: una “etiqueta” (única) para cada elemento del vector

  • Los nombres de un vector son un vector de caracteres de la misma longitud

altura <- c(176, 165, 189, 155, 168)
altura
names(altura) <- c("Jose", "Maria", "Juan", "Elena", "Rosa")
names(altura)
altura

Aritmética de vectores

  • La mayoría de los operadores se aplican elemento-a-elemento
a <- seq(1,3,1)
b <- seq(6,8,1)
a+b
a*b
  • Con diferentes longitudes, se repite el vector corto cuanto sea necesario
b <- 6:9
a + b
# a veces es lo que queremos!  
a + 1
  • Si las dimensiones no son múltiplos exactos…
b <- 1:12  
a+b   # Warning!     
  • Algunas funciones relevantes
length(xvect)   # longitud
sort(xvect)     # ordenar
max(xvect)      # máximo
min(xvect)      # mínimos
sum(xvect)      # suma 
prod(xvect)     # producto 
mean(xvect)     # media 
var(xvect)      # varianza
table(xvect)    # frecuencias

summary(xvect)  # estadísticos 

Vectores lógicos

  • Obtenemos objeto lógico enunciando una relación que puede ser cierta o falsa

  • Estos enunciados incluyen comparaciones básicas de igualdad o desigualdad

1 == 1  # TRUE
1 != 3  # TRUE
1 > 2   # FALSE
a <- 3 
a >= 3       # TRUE
a + 1 <= 10  # FALSE
  • O combinar varios enunciados con operadores Y (&), O (|) y NO (!):
  • Para conjuntos, x %in% Y es cierto cuando x es un elemento de Y
  • En vectores las operaciones son elemento a elemento
altura >= c(175,165,195,165,168)
altura == 155
altura > 160 & altura <= 180
altura < 160 | altura >= 180

condicion <- !(altura <= 170)

Acceso a los elementos de un vector

  • Se utiliza el operador [] (paréntesis cuadrado)1 y
  1. Posiciones de los elementos, usando un vector de enteros
altura[3]
altura[c(1,3,5)]
  • Con enteros negativos, indicamos posiciones que NO queremos
altura[-c(2,4)] 
  1. Nombres de los elementos, usando un vector de caracteres
altura[ "Juan" ]
altura[ c("Jose", "Elena") ]
  1. Condición que satisfacen los elementos, usando un vector lógico
altura[altura > 180 | altura < 160]

Acceso a los elementos de un vector (cont.)

  • Los vectores de selección pueden ser un objeto previamente asignado en los tres casos; p.e.,
pos <- (altura > 180 | altura < 160)
altura[pos]
  • Podemos seleccionar un subconjunto del vector para trabajar con él
alturaExtremo <- altura[pos]
mean(alturaExtremo)
  • Con la asignación se pueden cambiar elementos específicos de un vector (o añadir nuevos)
altura[3] <- 196

altura[c("María", "Luis")] <- c(169, 175)

Factores

  • Los factores son un tipo de objeto de R específico para trabajar con información cualitativa

  • Los datos originales pueden estar codificados de forma poco clara para el análisis (género como número o abreviatura)

  • Se usa factor() para crear un vector de tipo factor, con argumentos para los niveles y sus etiquetas

genero   <- c(1, 2, 2, 1, 1)
genero_f <- factor(genero, 
                    labels = c("Mujer", "Hombre"), 
                    levels = c(1,2))
  • También podemos crear un factor con orden
satisf   <- c("Alto", "Bajo", "Alto", "Bajo", "Medio")
satisf_f <- factor(satisf, order = TRUE,
                        levels = c("Bajo", "Medio", "Alto"))

“Resumiendo” un vector numérico o un factor

  • La función summary() devuelve los principales estadísticos descriptivos de un vector numérico
summary(altura)
  • Para información cualitativa, la media y otros estadísticos no tienen sentido
summary(genero)
genero  <- c(1, 20, 20, 1, 1)  # dos categorías igualmente
summary(genero)
  • La función summary() ofrece resultados diferentes según el tipo de objeto (porque tiene distintas propiedades)
summary(genero_f)

Matrices

  • Las matrices son una extensión de vectores a dos dimensiones.
  • Se pueden crear con matrix() o uniendo vectores filas o vectores columnas (de las mismas dimensiones) con cbind() y rbind()
r1 <- 1:4
r2 <- c(4, 8, 5, 10)
M1 <- rbind(r1, r2)
c1 <- 11:12
c2 <- 25:26
c3 <- c(14, 25)
M2 <- cbind(c1, c2, c3)
  • Podemos usarlos para añadir nuevas filas, columnas u otra matriz
  • Podemos dar nombres a columnas y filas
colnames(M2) <- c("ene", "feb", "mar")
rownames(M2) <- c("gast", "ingr")

Matrices (cont.)

  • Usamos los paréntesis cuadrados para acceder a los elementos (o una sub-matriz) por posición, nombre o condición lógica
M2[1,3]                 
M2["ingr", "ene"]      
M2[c(1:2),c(1,3)]
M2[2,]      # fila entera
M2[,"feb"]  # columna entera
  • Las operaciones habituales son elemento a elemento: la matrices deben tener las mismas dimensiones (o R repetirá elementos)
matrx + M2
matrx * M2
matrx - 3
matrx * 10 
  • Se pueden hacer todo tipo operaciones matriciales con R como multiplicación matricial, %*%, transponer, t(M1), invertir, solve(A), etc.

  • También existen funciones para matrices: diag(), rowSums(), colMeans(), etc.

Listas

  • Una lista es una colección genérica de objetos: similares a los vectores, pero conteniendo objetos de distintos tipos
x <- 1:30
miLista <- list("hola", x, list(1:4, "X"))
miLista
  • La función str también se puede usar para listas
str(miLista)
  • Podemos añadir nombres a los elementos de una lista o dáreselos al generarla:
names(miLista) <- c("saludo", "vec", "lista")
miLista <- list(saludo="hola", vec=x, lista=list(1:4, "X"))

Listas (cont.)

  • Con [] extraemos elementos por posición o por nombre, como listas
class(miLista["vec"])
miLista[2] + 2     # operación incompatible entre clases
  • Con [[ ]] (por posición o por nombre) o con $(solo por nombre) extraemos los elementos en su clase original
class(miLista$"vec")
class(miLista[[2]])
miLista[["vec"]] + 2
  • unlist() convierte una lista en vector, usando la clase que pueda ajustarse a todos los objetos (elementales)

“Data Frames”

  • Es un tipo de objetos específico para facilitar el análisis de datos: una colección de variables por columnas y observaciones por filas.

  • Se pueden crear con data.frame() a partir de vectores existentes, dando nombres a las variables, o de matrices

    • A diferencia de las matrices, las columnas pueden ser de tipo diferentes
altura <- c(177, 178, 168, 164, 186, 162, 160)
peso   <- c(75, 85, 70, 60, 80, 65, 54)
genero <- factor(c(1,2,2,2,1,1,2), 
                labels = c("Mujer", "Hombre"))
datos <- data.frame("Altura"=altura, "Peso"=peso, "Genero"= genero)
class(datos) 
  • Se puede visualizar con View(datos) o en “Enviroment” de RStudio
View(datos)
  • O solo una parte de los datos con head() y tail()

Trabajando con “Data Frames”

  • Podemos acceder a columnas por su nombre con $ o por nombre o posición de la columna con [[ ]]
vectAltura <- datos$Altura    # objeto resultante = vector
datos[[2]] == datos[["Peso"]]
  • También se puede usar notación de matrices.
datos[,1]           # 1ª columna  = vector
datos[1,c("Altura", "Genero")]   # data frame
datos[1:3,1:2]                   # data frame
  • También seleccionamos usando filtros basados en condiciones lógicas
d1 <- datos[datos$Altura > 165,]           # data.frame
d2 <- datos[datos$Altura %in% c(177,178), "Altura"] # vector

Trabajando con “Data Frames” (cont.)

  • La función subset() extrae parte de los datos, basado en una condición lógica; devuelve siempre un “data frame”
D1 <- subset(datos, Altura > 165)   
D2 <- subset(datos, subset = Altura %in% c(177,178),
                    select = Altura) 
  • Generamos nuevas variables con el vector de asignación
datos$Altura_m <- datos$Altura / 100
  • En general, no generaremos nuestros conjuntos de datos sino que los incorporaremos como objetos a R de varias formas.

Extendiendo R

Bibliotecas (“libraries”)

  • Una biblioteca contiene nuevos objetos de R: funciones, datos, etc.

  • Para instalar una nueva biblioteca (se hace una vez), en Tools > Install packages o en o con el comando

install.packages("AER")
  • Mantenemos actualizados los paquetes, en el menú Tools o en

  • La biblioteca solo está disponible si se carga en la sesión actual

library(AER)
  • Nota: en adelante, la bibliotecas que carguemos se suponen instaladas

  • En vemos las bibliotecas instaladas y las cargadas aparecen marcadas

Bibliotecas (cont.)

  • El nombre completo de un objeto es biblioteca::nombre

    • La biblioteca solo es necesaria si no se ha cargado o dos objetos diferentes tienen el mismo nombre en bibliotecas distintas
base::log(1)
log(1)
library(Hmisc)
find("units")
  • También se usa nombre completo si no se ha cargado la biblioteca

  • Para mostrar todos los datos de las bibliotecas cargadas

data()
  • Los podemos cargar en el “Environment” y obtener información detallada en la ayuda (ej., nombre de variables)
data("Affairs")
help("Affairs")

Datos “nativos” en R

  • Guardamos objetos del espacio de trabajo con save() (en una ruta relativa al directorio de trabajo)
x <- 1:20
y <- 2 * x ^ 2 + 1
save(x, file="data/x.RData")      # un objeto, o varios
save(x, y, file="data/xy.RData")  #   separados por comas
  • Para cargar datos al espacio de trabajo, con load() (= icono Cargar_Load)
load("data/xy.RData")
  • En la pestaña de : doble-clic carga un archivo de datos

  • Nota: este tipo de archivo puede contener varios objetos, incluidas varios conjuntos de datos

Datos en otros formatos externos a R

  • Varias bibliotecas permiten trabajar con distintos tipos de archivos de datos; entre otros:

    1. Texto, con delimitadores o de ancho fijo: utils (R base), readr
    2. Hojas de cálculo: readxl, openxlsx
    3. Formatos de software estadístico: haven, foreign
  • Descargad estos ejemplos: renta.txt, sex_data.csv, beauty.xls, nsw.dta

  • En Import Dataset de RStudio, tenemos acceso visual para cargar algunos formatos (con la biblioteca necesaria instalada)

  • rio es un meta-paquete (instala otras bibliotecas) para importar y exportar varios formatos de datos de forma sencilla

    • A partir de la extensión del archivo, detecta el formato y, por tanto, la biblioteca necesaria

`

Importar y exportar con rio

  • rio permite trabajar con varios formatos de forma simple y unificada (el mismo comando para todos)

    • P.e., datos nativos de R, archivos de texto (también comprimidos), hojas de cálculo, formatos de software estadístico, Google Sheets, json

    • En la Ayuda se incluye una presentación completa del paquete

  • El comando import() se usa para leer los datos

library(rio)
sex   <- import("data/sex_data.csv")
renta <- import("data/renta.txt")
beauty <- import("data/beauty.xls")
nsw    <- import("data/nsw.dta")    # formato Stata

Importar y exportar con rio (cont.)

  • Las opciones por defecto para un archivo pueden no ser adecuadas (p.e., el tipo de separador con .csv)

  • La Ayuda describe los argumentos para cambiarlas

    • a veces, pasando argumentos del comando de la biblioteca original
  • Podemos exportar datos a un tipo de formato con export()

export(nsw, "data/nsw.csv")
  • O convertir un archivo del disco a otro formato con convert()

Otras fuentes de datos

  • La biblioteca httr tiene la función GET() para descargar una página web

  • Bibliotecas con datos muy utilizados: pwt (“Penn World Tables”)

  • Bibliotecas con funciones para acceder directamente a datos online (con APIs públicas)

    • rdbnomics para los datos gratuitos de https://db.nomics.world/

    • OECD para los datos de la OCDE

    • eurostat (incluye datos del INE español)

    • quandl (de pago)

    • quantmod y tidyquant

    • MicroDatosEs con microdatos del INE (ej., EPA)

Gráficos Básicos

  • Podemos representar gráficos de dos variables o funciones
x <- c(3, 4, 5, 6, 7, 8, 9)
y <- c(5, 6, 8, 9, 5, 9, 10)
plot(x,y)
curve(x^2, from=-2, to=2)
  • El resultado aparece en la pestaña Plots de RStudio
  • Podemos cambiar opciones (ver Ayuda de plot.default) como type (puntos, líneas, etc.), símbolo de punto (pch), tipo de línea (lty), ancho de línea (lwd), color (col), título, etiquetas de los ejes, etc.
plot(x, y, type="b", pch=3)
plot(x, y, type="l", lty=2, lwd=2)
plot(x, y, xlab="Eje X", ylab="Eje Y", main="Mi título")
  • Se pueden cambiar más opciones con par(), combinar gráficos, añadir líneas, texto, etc. y exportar los gráficos

Estadísticos descriptivos: variables discretas

  • Para variables discretas (factores), table() calcula distribuciones de frecuencias de una variable o conjuntas: el resultado es un objeto
data("PSID1982", package = "AER")
(frec   <- table(PSID1982$occupation) )
(frec_c <- table(PSID1982$occupation, PSID1982$ethnicity))
  • Podemos mostrar frecuencias relativas con prop.table()
prop.table(frec)
prop.table(frec_c)
prop.table(frec_c, margin = 1)
prop.table(frec_c, margin = 2)
  • También es informativa su representación con gráficos de barras
barplot(frec, horiz = T)
barplot(prop.table(frec_c), beside = T)

Estadísticos descriptivos: variables continuas

data(ceosal1, package='wooldridge')
  • Ya hemos visto funciones de estadísticos como mean(), var(), etc.
median(ceosal1$salary)
var(ceosal1$salary)
quantile(ceosal1$salary, 
         probs=c(0.25, 0.75) ) # 1er y 3er cuartil

summary(ceosal1$salary)  # de una variable (vector)
summary(ceosal1)         # de todo el conjunto de datos  

cov(ceosal1$salary, ceosal1$roe)  # covarianza
cor(ceosal1$salary, ceosal1$roe)  # correlación

Estadísticos descriptivos: variables continuas (cont.)

  • Para variables continuas, las frecuencias de valores en un intervalo se pueden tabular o graficar en un histograma
hist(ceosal1$roe)   # intervalos automáticos
hist(ceosal1$roe, freq=F,       # densidad, no casos
     breaks=c(0,5,10,20,30,60)) # intervalos explícitos
  • O la densidad (versión suavizada del histograma)
plot(density(ceosal1$roe))
  • Un gráfico de caja ofrece información resumida de la distribución: mediana, 1er y 3er cuartil, y valores “extremos”
boxplot(ceosal1$roe, horizontal=T)
boxplot(ceosal1$roe~ceosal1$consprod)

Valores ausentes (“missing values”): NA

  • Muchos conjuntos de datos tienen valores ausentes de ciertas observaciones para algunas variables: ej., descargad earn.RData
  • Sabemos si una observación es NA y la frecuencia total:
load("data/earn.RData")
x <- earn$earnings
is.na(x)
table(is.na(x))
  • Por defecto en R, un cálculo con NAs es NA: debemos decir que los elimine explícitamente (y ser conscientes de lo que implica)
mean(x)
mean(x, na.rm=TRUE)
  • na.omit() elimina observaciones con NAs de una o varias variables
earn2 <- na.omit(earn)
  • ¿Cómo tratar los NAs? Eliminarlos implica selección muestral y la alternativa de imputar valores implica supuestos sobre éstos

Estadísticas por grupos: aggregate

  • Para obtener estadísticas de una variable por grupos definidos por otra, podemos filtrar los datos
mean(ceosal1$roe[ceosal1$indus==1])
mean(subset(ceosal1, indus==0)$roe)
  • Pero la función aggregate() lo hace más sencillo y devuelve un data frame
aggregate(roe ~ indus, data=ceosal1,  FUN=mean)
  • También en función de varias variables
aggregate(roe ~ indus + finance, data=ceosal1,  FUN=mean)
  • Notar la notación de formulas en R: ~ indica “en función de”, separando las variables con +

Funciones para distribuciones de probabilidad

  • Densidad (variables continuas) o de masa (variables discretas) de probabilidad de un valor x:
    • dbinom(), dunif(), dlogis(), dnorm(), dchisq(), dt(), dF()
  • Distribución acumulada por debajo de x

    • pbinom(), punif(), plogis(), pnorm(), pchisq(), pt(), pF()
  • Valor cuya probabilidad acumulada es el cuartil q

    • qbinom(), qunif(), qlogis(), qnorm(), qchisq(), qt(), qF()
  • Generador de números (pseudo)aleatorios:

    • rbinom(), runif(), rlogis(), rnorm(), rchisq(), rt(), rF()
set.seed(7675)
rnorm(5)

Nota sobre programación “avanzada”

  • Como en todo lenguaje de programación R, tiene funciones para

    • Ejecución condicional if(): una parte del código se ejecuta solo si se cumple una condición

    • Bucles for(): se repite un mismo bloque de código mientras se itera por los valores de vector

    • Crear funciones propias con function()

  • Una variante de la ejecución condicional, solo para crear variables según una condición

data("Affairs", package = "AER")
Affairs$univers <- ifelse(Affairs$education>15, 1, 0)

Simulaciones

  • En la realidad, los datos se consideran una muestra de una población con parámetros desconocidos: estimamos para inferir sus valores

  • Un ordenador permite razonar “a la inversa”: fijar los parámetros de la población, generar una muestra aleatoria de esa distribución y estimar

  • “Vemos” la variabilidad muestral de los estimadores: p.e., las medias de muestras obtenidas de la misma distribución son distintas

set.seed(543210)
sample1 <- rnorm(100,10,2)
mean(sample1)
#
sample2 <- rnorm(100,10,2)
mean(sample2)
  • No debe sorprendernos y, de hecho, sabemos cómo es esa variabilidad: si \(Y_i \sim N(\mu, \sigma^2)\), entonces \(\bar{Y}=\frac{1}{n} \sum_{i=1}^n Y_i \sim N(\mu, \frac{\sigma^2}{n})\)

Simulaciones (cont.)

  • Los bucles for permiten repetir el proceso muchas veces
set.seed(123456)
r <- 10000
ybar <- numeric(r)
for (j in 1:r) {
  sample <- rnorm(100,10,2)
  ybar[j] <- mean(sample)
}
  • Y comprobar si se cumple la teoría estadística
ybar[1:20]
mean(ybar)
var(ybar)
plot(density(ybar))
curve(dnorm(x,10, 2/sqrt(100)), 
       add=TRUE,lty=2)

Propiedades asintóticas

  • El análisis asintótico se ocupa del comportamiento de los estimadores cuando el tamaño muestral es grande

  • Para una muestra de tamaño \(n\) de una población (de “cualquier” distribución) \(Y\sim (\mu, \sigma^2)\),

    • según la ley de los grandes números, \(E(\bar{Y}) \to \mu\) cuando \(n \to \infty\)

    • según el teorema central del límite, \(\bar{Y} \overset{a}{\sim} N(\mu, \sigma^2/n)\)

set.seed(123456)
r <- 10000
ybar <- numeric(r) 
n <- 10  # 10, 50, 100, 1000
for (j in 1:r) {  
  sample <- rchisq(n,1) 
  ybar[j] <- mean(sample) 
}
plot(density(ybar))